﻿using System;
using Csla;
using Ent.AccesoDatos;
using System.Collections.Generic;

namespace Ent.Inscripcion.Core.Administracion
{
    [Serializable]
    public class OfertaTutoria : BusinessBase<OfertaTutoria>
    {
        #region Business Methods

        private static PropertyInfo<Guid> IdProperty = RegisterProperty<Guid>(o => o.Id, "Id");
        public Guid Id
        {
            get { return GetProperty(IdProperty); }
            set { SetProperty(IdProperty, value); }
        }

        private static PropertyInfo<DateTime> FechaInicioProperty = RegisterProperty<DateTime>(o => o.FechaInicio, "Fecha Inicio");
        public DateTime FechaInicio
        {
            get { return GetProperty(FechaInicioProperty); }
            set { SetProperty(FechaInicioProperty, value); }
        }

        private static PropertyInfo<DateTime> FechaFinProperty = RegisterProperty<DateTime>(o => o.FechaFin, "Fecha Fin");
        public DateTime FechaFin
        {
            get { return GetProperty(FechaFinProperty); }
            set { SetProperty(FechaFinProperty, value); }
        }

        private static PropertyInfo<int> EstadoProperty = RegisterProperty<int>(o => o.Estado, "Name");
        public int Estado
        {
            get { return GetProperty(EstadoProperty); }
            set { SetProperty(EstadoProperty, value); }
        }

        private static PropertyInfo<string> PeriodoIdProperty = RegisterProperty<string>(c => c.PeriodoId);
        /// <Summary>
        /// Gets or sets the codigo value.
        /// </Summary>
        public string PeriodoId
        {
            get { return GetProperty(PeriodoIdProperty); }
            set { SetProperty(PeriodoIdProperty, value); }
        }

        private static PropertyInfo<string> NombreProperty = RegisterProperty<string>(c => c.Nombre);
        // <Summary>
        // Gets or sets the nombre value.
        // </Summary>
        public string Nombre
        {
            get { return GetProperty(NombreProperty); }
            set { SetProperty(NombreProperty, value); }
        }

        private static PropertyInfo<string> DescripcionProperty = RegisterProperty<string>(c => c.Descripcion);
        /// <Summary>
        /// Gets or sets the Descripcion value.
        /// </Summary>
        public string Descripcion
        {
            get { return GetProperty(DescripcionProperty); }
            set { SetProperty(DescripcionProperty, value); }
        }

        #endregion

        #region Validation Rules

        protected override void AddBusinessRules()
        {
            // TODO: add validation rules
            //ValidationRules.AddRule(RuleMethod, "");
        }

        #endregion

        #region Factory Methods

        public static OfertaTutoria NewOfertaTutoria()
        {
            return DataPortal.Create<OfertaTutoria>();
        }

        public static OfertaTutoria GetOfertaTutoria(Guid id)
        {
            return DataPortal.Fetch<OfertaTutoria>(id);
        }

        public static void DeleteOfertaTutoria(Guid id)
        {
            DataPortal.Delete<OfertaTutoria>(id);
        }

        private OfertaTutoria()
        {
            LoadProperty(IdProperty, Guid.NewGuid());
        }

        #endregion

        #region Data Access

        [RunLocal]
        protected override void DataPortal_Create()
        {
            base.DataPortal_Create();
        }

        private void DataPortal_Fetch(Guid criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro> {new Parametro("Id", criteria)};
            var datos = accesoDatos.EjecutarReader("ConsultarOfertaTutoria", parametros);
            if (datos.Datos.Read())
            {
                LoadProperty(IdProperty, Guid.Parse(datos.Datos.GetString(0)));
                LoadProperty(PeriodoIdProperty, datos.Datos.GetString(1));
                LoadProperty(NombreProperty, datos.Datos.GetString(2));
                LoadProperty(DescripcionProperty, datos.Datos.GetString(3));
                LoadProperty(FechaInicioProperty, DateTime.Parse(datos.Datos.GetString(4)));
                LoadProperty(FechaFinProperty, DateTime.Parse(datos.Datos.GetString(5)));
                LoadProperty(EstadoProperty, int.Parse(datos.Datos.GetString(6)));
            }
            if (!datos.Datos.IsClosed) datos.Datos.Close();
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Insert()
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro>
                                 {
                                     new Parametro("Fecha_Inicio", ReadProperty(FechaInicioProperty)),
                                     new Parametro("Fecha_Fin", ReadProperty(FechaFinProperty)),
                                     new Parametro("Nombre", ReadProperty(NombreProperty)),
                                     new Parametro("Descripcion", ReadProperty(DescripcionProperty)),
                                     new Parametro("Periodo_Id", ReadProperty(PeriodoIdProperty)),
                                     new Parametro("Id", ReadProperty(IdProperty))
                                 };
            accesoDatos.EjecutarQuery("InsertarOfertaTutoria", parametros);
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Update()
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro>
                                {
                                    new Parametro("Estado", ReadProperty(EstadoProperty)),
                                    new Parametro("Id", ReadProperty(IdProperty))
                                };
            accesoDatos.EjecutarQuery("ActualizarOfertaTutoria", parametros);
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_DeleteSelf()
        {
            DataPortal_Delete(ReadProperty(IdProperty));
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        private void DataPortal_Delete(Guid criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro> { new Parametro("Id", ReadProperty(IdProperty)) };
            accesoDatos.EjecutarQuery("EliminarOfertaTutoria", parametros);
        }

        #endregion
    }


}
